스레드(Thread)

✒️ 2025-05-15 10:20 내용 수정


프로세스(Process)

프로그램을 실행하는 순간 메모리에 올려서 동작하는 것


스레드

프로세스 내에서 실제로 작업을 수행하는 것

담당자
JVM 스레드 스케쥴링, 스레드 개수 파악, 스레드의 우선순위 확인
스레드가 실행되는 프로그램 코드의 메모리 위치 확인
현재 스레드의 상태 확인
개발자 자바 스레드로 작동할 작업이 무엇인지 코드로 작성
스레드 코드가 작동할 수 있도록 JVM에 요청

구현 방법

  1. Thread 클래스를 상속해서 run() 메서드 구현
    • Thread의 run() 메서드는 독립적으로 수행하지 못한다.
    • run() 을 그냥 호출해버리면 일반 메서드처럼 수행해버리므로, 반드시 Thread의 start() 메서드로 run()을 호출해야 한다.
public class ThreadTest extends Thread{
	@Override
	public void run() {
	// 작업내용
	}
}
public class ThreadMain {
	public static void main(String[] args) {
		// Thread 클래스 상속 후 객체 생성
		ThreadTest t1 = new ThreadTest();
		t1.start();
	}
}
  1. Runnable 인터페이스 구현하고, Thread 클래스로 객체 생성하기
    • Runnable 인터페이스는 함수형 인터페이스이므로 람다식으로 표현할 수 있다.
    • 함수형 인터페이스 참고
public class RunnableTest implements Runnable {
	@Override
	public void run() {
	// 작업내용
	}
}
public class ThreadMain {
	public static void main(String[] args) {
		// Runnable 인터페이스 구현 후 Thread 클래스로 객체 생성 후 사용
		RunnableTest t2 = new RunnableTest();
		Thread t = new Thread(t2);
		t.start();
	}
}
// 람다식으로 Runnable을 구현한 방법
public class Main {
	public void static main(String[] args) {
		Runnable rn = () -> {
		// 작업할 내용
		};
		Thread t = new Thread(rn);
		t.start();
	}
}

Thread 클래스

메서드 설명
static Thread currentThread() 현재 수행되는 스레드 객체를 반환
String getName() 스레드의 이름을 반환
void setName(String name) 스레드의 이름을 지정
int getPriority() 스레드의 우선순위를 반환, 숫자가 작을수록 높은 우선순위
void setPriority(int newPriority) 스레드의 우선순위를 지정
void start() 스레드를 시작
State getState() 스레드의 상태를 반환
상태변화 메서드 설명
static void sleep(long millis) millisecond에 지정된 시간만큼 대기
void join() 현재 스레드는 join() 메서드를 호출한 스레드가 종료할 때까지 대기
static void yield() 수행중인 스레드 중 우선순위가 같은 스레드에게 제어권을 넘김
스레드 자신에게 주어진 실행시간을 다음 차례의 스레드에게 양보하고, 자신은 실행 대기 상태가 된다.
void wait() 스레드를 대기시킴
void notify() 대기중인 스레드를 다시 동작시킴

스레드의 상태(State)

thread_state.png

상태 상수 설명
생성 NEW 스레드 객체가 생성되었지만 아직 start()에서 호출되지 않은 상태
대기 RUNNABLE 실행 대기 또는 실행 상태로 언제든지 갈 수 있는 상태
일시정지 WAITING 다른 스레드가 종료될 때까지 대기하는 상태
일시정지 TIMED_WAITING 주어진 시간 동안 대기하는 상태
일시정지 BLOCKED 락이 풀릴 때까지 대기하는 상태
종료 TERMINATED 수행을 종료한 상태
public class ThreadMethod extends Thread {
	@Override
	public void run() {
		this.setName("Thread3");
		System.out.println("현재 실행되고 있는 스레드의 이름 : " + Thread.currentThread().getName());
		System.out.println("현재 실행되고 있는 스레드의 상태 : " + Thread.currentThread().getState());
		System.out.println("현재 실행되고 있는 스레드의 우선순위 : " + Thread.currentThread().getPriority());
	}
}
public class ThreadMain {
	public static void main(String[] args) {
		ThreadMethod tm = new ThreadMethod();
		tm.start();

		System.out.println("메인에서 현재 실행되고 있는 스레드의 이름 : " + Thread.currentThread().getName());
		System.out.println("메인에서 현재 실행되고 있는 스레드의 상태 : " + Thread.currentThread().getState());
		System.out.println("메인에서 현재 실행되고 있는 스레드의 우선순위 : " + Thread.currentThread().getPriority());
	}
}
메인에서 현재 실행되고 있는 스레드의 이름 : main
현재 실행되고 있는 스레드의 이름 : Thread3
현재 실행되고 있는 스레드의 상태 : RUNNABLE
메인에서 현재 실행되고 있는 스레드의 상태 : RUNNABLE
현재 실행되고 있는 스레드의 우선순위 : 5
메인에서 현재 실행되고 있는 스레드의 우선순위 : 5

데몬스레드

스레드객체이름.setDaemon(true);

package ex3_thread;

public class DaemonTest {
   public static void main(String[] args) {
   	Thread daemonThread = new Thread(new MyDaemonRunnable());
   	
   	// 직접 만든 스레드를 데몬 스레드로 설정
   	daemonThread.setDaemon(true);

   	daemonThread.start();
   	
   	for(int i = 1; i <= 15; i++) {
   		System.out.println(i);
   		try {
   			Thread.sleep(1000);
   		} catch (Exception e) {
   		}
   	}
   	System.out.println("메인 스레드 종료");
   }
}

class MyDaemonRunnable implements Runnable {
   @Override
   public void run() {
   	try {
   		for(int i = 1; i <= 15; i++) {
   			System.out.println("저장되었습니다.");
   			Thread.sleep(3000);
   		}
   	} catch (Exception e) {
   	}
   }
}